home *** CD-ROM | disk | FTP | other *** search
/ Speccy ClassiX 1998 / Speccy ClassiX 98.iso / amiga_system / the_aminet / dev / gcc / ixemulsrc.lha / ixemul-41.4 / library / __lock.c < prev    next >
C/C++ Source or Header  |  1995-05-18  |  4KB  |  157 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  __lock.c,v 1.1.1.1 1994/04/04 04:30:10 amiga Exp
  20.  *
  21.  *  __lock.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:10  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  26.  *  Initial revision
  27.  *
  28.  */
  29.  
  30. #define KERNEL
  31. #include "ixemul.h"
  32.  
  33. #if __GNUC__ != 2
  34. #define alloca __builtin_alloca
  35. #endif
  36.  
  37. struct lock_vec {
  38.   int    mode;
  39.   int    resolve_last;
  40. #ifdef LOCK2
  41.   BPTR  *dup_parent;
  42.   char **base_name;
  43. #endif
  44. };
  45.  
  46. static int
  47. __lock_func (struct StandardPacket *sp, struct MsgPort *handler,
  48.              BPTR parent_lock,
  49.          BSTR name,
  50.          struct lock_vec *lv, int *no_error)
  51. {
  52.   sp->sp_Pkt.dp_Type = ACTION_LOCATE_OBJECT;
  53.   sp->sp_Pkt.dp_Arg1 = parent_lock;
  54.   sp->sp_Pkt.dp_Arg2 = name;
  55.   sp->sp_Pkt.dp_Arg3 = lv->mode;
  56.  
  57.   PutPacket (handler, sp);
  58.   __wait_sync_packet (sp);
  59.   
  60.   *no_error = sp->sp_Pkt.dp_Res1 > 0;
  61.   
  62. #ifdef LOCK2
  63.   if (*no_error && lv->dup_parent)
  64.     *lv->dup_parent = DupLock (parent_lock);
  65.   if (*no_error && lv->base_name)
  66.     {
  67.       u_char *tmp = BTOCPTR (name);
  68.     
  69.       *(lv->base_name) = syscall (SYS_malloc, tmp[0] + 1);
  70.       bcopy (tmp+1, *lv->base_name, tmp[0]);
  71.       (*(lv->base_name))[tmp[0]] = 0;
  72.     }
  73. #endif
  74.  
  75.   /* continue if we failed because of symlink - reference ? */
  76.   return lv->resolve_last;
  77. }
  78.  
  79. BPTR
  80. __lock (char *name, int mode)
  81. {
  82.   struct lock_vec lv;
  83.  
  84.   lv.mode = mode;
  85.   lv.resolve_last = 1;
  86. #ifdef LOCK2
  87.   lv.dup_parent = 0;
  88.   lv.base_name = 0;
  89. #endif
  90.   
  91.   return __plock (name, __lock_func, &lv);
  92. }
  93.  
  94. BPTR
  95. __llock (char *name, int mode)
  96. {
  97.   struct lock_vec lv;
  98.  
  99.   lv.mode = mode;
  100.   lv.resolve_last = 0;
  101. #ifdef LOCK2
  102.   lv.dup_parent = 0;
  103.   lv.base_name = 0;
  104. #endif
  105.  
  106.   return __plock (name, __lock_func, &lv);
  107. }
  108.  
  109. #ifdef LOCK2
  110. BPTR
  111. __lock2 (char *name, int mode, BPTR *parent_lock, char **base_name)
  112. {
  113.   struct lock_vec lv;
  114.   BPTR res;
  115.  
  116.   lv.mode = mode;
  117.   lv.resolve_last = 1;
  118.   lv.dup_parent = parent_lock;
  119.   lv.base_name  = base_name;
  120.   
  121.   res = __plock (name, __lock_func, &lv);
  122.   
  123. #if 0
  124.   /* disabled currently, because the only client was __load_seg(), and I
  125.    * did a cleaner solution by CurrentDir()'ing to the file itself. */
  126.  
  127.   if (res >= 0)
  128.     {
  129.       /* If you __lock2("device:file"), then you always get a parent lock
  130.        * of zero, which just means in this case, that the file is in the
  131.        * root directory of the file system. However, functions that use 
  132.        * __lock2() want to be able to CurrentDir to this lock, so 0 won't work.
  133.        * So if parent_lock is 0, and the specified file really is such a 
  134.        * one-level file, then we __lock() the device explicitly */
  135.  
  136.       if (parent_lock && !*parent_lock)
  137.     {
  138.       char *cp, c;
  139.       
  140.       cp = index (name, ':');
  141.       if (cp && !index (cp, '/'))    /* is it a first-level file ? */
  142.         {
  143.           cp++;
  144.           c = *cp;
  145.           *cp = 0;    /* temporarily terminate the string after the colon */
  146.           *parent_lock = __lock (name, ACCESS_READ);
  147.           *cp = c;
  148.         }
  149.     }
  150.     }
  151.  
  152. #endif
  153.  
  154.   return res;
  155. }
  156. #endif /* LOCK2 */
  157.